home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Examples / AppKit / Draw / textUndo.subproj / TextSelChange.m < prev    next >
Text File  |  1992-02-09  |  2KB  |  106 lines

  1. #import "textundo.h"
  2.  
  3. @implementation TextSelChange
  4.  
  5. /*
  6.  * The TextSelChange is the workhorse of undoable text. It records the
  7.  * contents of the selection (via TextSelection objects) before and after
  8.  * a change is made. By alternately installing and removing the old and new
  9.  * selections, the original change can be undone and redone.
  10.  */
  11.  
  12. - initView:aView name:(const char *)str
  13. {
  14.     [super initView:aView];
  15.  
  16.     oldSel = nil;
  17.     newSel = nil;
  18.  
  19.     name = str;
  20.  
  21.     return self;
  22. }
  23.  
  24. - free
  25. {
  26.     if (newSel) {
  27.     [newSel free];
  28.     }
  29.  
  30.     if (oldSel) {
  31.     [oldSel free];
  32.     }
  33.  
  34.     return [super free];
  35. }
  36.  
  37. - (const char *)changeName
  38. {
  39.     return name;
  40. }
  41.  
  42. - saveAfterChange
  43. {
  44.     newSel = [[[TextSelection alloc] initText:textView] capture];
  45.     return self;
  46. }
  47.  
  48. - saveBeforeChange
  49. {
  50.     NXSelPt start, end;
  51.  
  52.     [textView getSel:&start :&end];
  53.     selStart = start.cp;
  54.     selEnd = end.cp;
  55.  
  56.     oldSel = [TextSelection alloc];
  57.     [[oldSel initText:textView start:selStart end:selEnd] capture];
  58.     [oldSel setClickCount:[newSel clickCount]];
  59.  
  60.     return self;
  61. }
  62.  
  63. - undoChange
  64. {
  65.     [[textView window] disableFlushWindow];
  66.     [newSel remove];
  67.     [oldSel install];
  68.     [[[textView window] reenableFlushWindow] flushWindow];
  69.     
  70.     return [super undoChange];
  71. }
  72.  
  73. - redoChange
  74. {
  75.     NXRect oldBounds, invalidRect;
  76.     id delegate;
  77.  
  78.     [[textView window] disableFlushWindow];
  79.  
  80.     if (delegate = [textView delegate]) {
  81.     [textView getBounds:&oldBounds];
  82.     invalidRect = oldBounds;
  83.     invalidRect.size.width = 0.0;
  84.     invalidRect.size.height = 0.0;
  85.     } else {
  86.     delegate = nil;
  87.     }
  88.  
  89.     [oldSel remove];
  90.     [newSel install];
  91.  
  92.     if (delegate != nil &&
  93.        [delegate respondsTo:@selector(textDidResize:oldBounds:invalid:)])
  94.     {
  95.     [delegate textDidResize:textView
  96.                       oldBounds:&oldBounds
  97.                         invalid:&invalidRect];
  98.     }
  99.  
  100.     [[[textView window] reenableFlushWindow] flushWindow];
  101.  
  102.     return [super redoChange];
  103. }
  104.  
  105. @end
  106.